MATLAB自动化

您所在的位置:网站首页 matlab p文件破解 MATLAB自动化

MATLAB自动化

#MATLAB自动化| 来源: 网络整理| 查看: 265

在ECU开发过程中,使用标定工具进行标定或变量监控,通常会使用基于ASAP2标准的A2L文件,目前的Embedded Coder也是支持A2L文件的生成。

如下图选项勾选后,代码生成时也生成相应的A2L文件。

例如我们在模型中定义了Var_A,Var_B,Var_C,Var_X,Var_Y,Var_Z全局变量(监测量),以及Rate变量(标定量),在代码生成后,会自动生成一个A2L文件(A2L具体格式这里不进行细说,可自行度娘了解一下),部分文件内容截图如下:

我们可以看到Embedded Coder生成的A2L文件中变量地址是虚拟的,都用了0x0000替代,要想使用这个A2L文件,还需要将0x0000替换成变量的实际地址。

实际应用中,我们通常会对MCU 的Flash、RAM、EEPROM等内存区域按照不同类型、不同用途进行分段划分,将变量定义在指定的内存分段内(示例中没有进行分段,变量都默认定义在RAM中,分段名默认为'common')。

我们将上述模型生成的代码在CodeWarrior进行集成,编译成功后.map文件部分截图如下:

如上图,模型中涉及的每个变量都有实际的地址,我们要做的就是利用m脚本将这个.map文件与A2L进行匹配,将指定的变量地址用实际的地址进行替换(示例中仅对Var_A...这些变量的地址进行替换)。

脚本中主要涉及以下两个函数:

regexp 正则表达式strrep 字符串替换脚本设计思路:

1.在map文件中使用正则表达式获取所需变量的信息

对.map文件使用正则表达式,匹配查找到所需变量的分配情况,例如上述.map中,监测变量的地址分配有6段内容,可利用这6段内容进行精确匹配,获得变量的信息,包括变量名称、变量地址、变量大小等,示例代码如下:

2.在A2L文件中查找变量,替换地址

A2L文件中,每个变量都有如下一个固定格式:

(代码显示不全可左右滑动)

ECU_ADDRESS 0x0000 /* @ECU_Address@Var_A@ */

根据上述在.map中获取的变量信息,在A2L中查找对应变量,然后将上述固定格式中的虚拟地址替换成实际地址即可。(代码显示不全可左右滑动)

addrPrefix = '0x0000 /* @ECU_Address@'; addrSuffix = '@ */'; expr = [addrPrefix,match_name,addrSuffix]; repr = ['0x',replace_addr,' /* @ECU_Address@',match_name,addrSuffix]; ASAP2FileString = strrep(ASAP2FileString,expr,repr);

3.重写A2L

这里用fprintf函数,直接对原A2L文件进行重写。

完整代码如下:(代码显示不全可左右滑动)

ASAP2File = 'untitled.a2l'; % A2L File MAPFile = 'P&E_Multilink_CyclonePro.map'; % map file addrPrefix = '0x0000 /* @ECU_Address@'; addrSuffix = '@ */'; % Extract contents of ASAP2 file if exist(ASAP2File,'file') ASAP2FileString = fileread(ASAP2File); else DAStudio.error('RTW:asap2:UnableFindFile',ASAP2File); end % Extract contents of MAP file if exist(MAPFile,'file') MAPFileString = fileread(MAPFile); else DAStudio.error('RTW:asap2:UnableFindFile',MAPFile); end % Create symbol table from symbol names and addresses extracted from % .common pairs = regexp(MAPFileString, '\n\s*(\S+)\s+([0-9a-fA-F]+)\s+([0-9A-F]+)\s+([0-9]+)\s+([0-9]+)\s+.common', ... 'tokens'); MAPFileHash = containers.Map; for i = 1:length(pairs) MAPFileHash(pairs{i}{1}) = pairs{i}{2}; end % Identify placeholder strings and replace them dynamically with symbol var_name = keys(MAPFileHash); var_addr = values(MAPFileHash); for i = 1:length(var_name) match_name = var_name{i}; replace_addr = var_addr{i}; expr = [addrPrefix,match_name,addrSuffix]; repr = ['0x',replace_addr,' /* @ECU_Address@',match_name,addrSuffix]; ASAP2FileString = strrep(ASAP2FileString,expr,repr); end % Write new content to original ASAP2 file fid = fopen(ASAP2File, 'w'); fprintf(fid,'%s',ASAP2FileString); fclose(fid);



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3